#include "RingQueue.hpp"
#include <cstdlib>
#include <ctime>
#include <sys/types.h>
#include <unistd.h>

void *productor(void *args)
{
    RingQueue<int> *rq = (RingQueue<int> *)args;
    while (true)
    {
        // sleep(1); // 生产者慢

        // 生产数据或构建任务(外部获取/自己创造) -- 有时间消耗
        std::cout << "Producer is producing data... ";
        int data = rand() % 100 + 1;

        // pthread_t tid是一个地址 整形值很大 我们将他%10000是为了验证看到是不同的生产者线程
        std::cout << " 生产: " << data << " [" << pthread_self() % 10000 << "]" << std::endl;

        // 发送到交易场所 -- 环形队列
        rq->push(data);
    }
}

void *consumer(void *args)
{
    RingQueue<int> *rq = (RingQueue<int> *)args;
    while (true)
    {
        sleep(1); // 消费者慢
        int data;

        // 从环形队列中获取任务或数据
        rq->pop(&data);

        // 进行数据的处理 -- 有时间消耗
        std::cout << "Consumer is processing data... ";
        std::cout << " 消费: " << data << " [" << pthread_self() % 10000 << "]" << std::endl;
    }
}
#define prodctrNum 3
#define consmrNum 2
int main()
{
    srand((uint64_t)time(nullptr) ^ getpid());

    RingQueue<int> *rq = new RingQueue<int>();
    // rq->debug(); for debug

    pthread_t consmr[3], prodctr[2];
    for (int i = 0; i < prodctrNum; i++)
        pthread_create(prodctr + i, nullptr, productor, (void *)rq);
    for (int i = 0; i < consmrNum; i++)
        pthread_create(consmr + i, nullptr, consumer, (void *)rq);

    for (int i = 0; i < prodctrNum; i++)
        pthread_join(prodctr[i], nullptr);
    for (int i = 0; i < consmrNum; i++)
        pthread_join(consmr[i], nullptr);
    return 0;
}